Skip to content

Add pair programming plugin - #43

Merged
Daniel-ADFA merged 12 commits into
mainfrom
ADFA-4395
Aug 13, 2026
Merged

Add pair programming plugin#43
Daniel-ADFA merged 12 commits into
mainfrom
ADFA-4395

Conversation

@Daniel-ADFA

Copy link
Copy Markdown
Collaborator

No description provided.

@Daniel-ADFA
Daniel-ADFA requested review from a team and jomen-adfa July 9, 2026 22:06

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review for a one-time review, or @claude review always to subscribe this PR to a review on every future push.

Tip: disable this comment in your organization's Code Review settings.

@hal-eisen-adfa hal-eisen-adfa left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code On The Go plugin review — pair

Ran the /plugin-review workflow (build + security audit + submission rubric). Great engineering underneath — clean lifecycle teardown, canonicalized path handling, an authenticated LAN transport, and thorough docs — but there are submission-conformance blockers. Details inline; summary here.

🔴 Blockers

  1. Build fails from a clean checkout. ./gradlew assemblePlugin fails at :compileReleaseKotlin: libs/shared.jar doesn't exist, and behind it the code calls IdeEditorService.showPeerCursor/hidePeerCursor/clearPeerCursors and IdeProjectService.openProject(File), which aren't in the committed plugin-api.jar. The README/HTML confirm these live on the unmerged feat/ADFA-4419 branch. The plugin can't build against the repo's stage-tracked libs/ as submitted — this is the primary blocker.
  2. native.code permission with no native code. No .so/jniLibs/NDK C++ (and no QR/camera library is even declared), yet plugin.permissions requests native.code.
  3. No in-app help. No class implements DocumentationExtension — no Tier 1/2 tooltip entries, no Tier-3 offline assets/ help page, and the sidebar item has no tooltipTag.
  4. Missing plugin.editor_tabs manifest entry for the contributed editor tab.

🟡 Conditional

  • Add plugin.max_ide_version for a real compatibility range (only min is declared).

✅ Clean

  • Security: path traversal is defended (PathMapper.toLocalChecked canonicalizes + enforces the root boundary), the WebSocket server enforces a join token, no reflection, no committed secrets/keystores.
  • Resource discipline (6.2): the coroutine scope is cancelled in dispose(), sockets are closed on stopSession(), streams use .use{}, and PairServiceLocator.shutdown() nulls the PluginContext holder.
  • HTML documentation (6.6): all required sections, light bg / dark text, English, top-level.

Rubric scorecard

Clause Verdict
6.1 Compatibility Partial (no max_ide_version)
6.2 Resource discipline Pass
6.3 Build reproducibility Fail (build fails)
6.4 Native binaries Fail (native.code unused)
6.5 No reflection Pass
6.6 HTML documentation Pass
6.7 Tooltips & in-app help Fail (no DocumentationExtension)
Manifest declarations Fail (no plugin.editor_tabs)

Overall: BLOCK. Note: no device verification was possible — the build never produced a .cgp.

Comment thread pair/build.gradle.kts Outdated
Comment thread pair/src/main/AndroidManifest.xml Outdated
Comment thread pair/src/main/AndroidManifest.xml
Comment thread pair/src/main/AndroidManifest.xml Outdated
Comment thread pair/src/main/kotlin/com/appdevforall/pair/plugin/PairPlugin.kt Outdated
pair depends on com.itsaky.androidide.models.Range (shared.jar), which was
referenced from the common libs/ but never committed, so a clean checkout
could not build. Ship the jar plugin-locally under pair/libs/ instead of
the stage-tracked common libs/. Also drops the ndk abiFilters block: the
plugin has no native code.

Jar built from CodeOnTheGo :shared:jar.
- Drop the unused native.code permission (no native code ships in the plugin)
- Declare plugin.editor_tabs for the contributed Pair editor tab
- Pin the supported IDE range: min_ide_version = max_ide_version = 26.32,
  the release that ships the peer-cursor/openProject plugin API
- Implement DocumentationExtension: tooltip entry on the sidebar item
  (tag pair.sidebar) with summary, detail, and a User guide button, plus
  a Tier-3 offline guide at assets/docs/index.html
Comment thread pair/src/main/kotlin/com/appdevforall/pair/plugin/PairPlugin.kt Outdated
alome007 and others added 6 commits August 12, 2026 15:51
…rom M3 Typography

Typography built from PluginTextStyles carried explicit colors (labelLarge
had onSurface baked in), which override Material3 per-slot content colors —
filled buttons rendered onSurface (black in light mode) instead of onPrimary.
Typography is now colorless and PairContent's root Box is a Surface so
LocalContentColor provides onSurface to plain text. Verified on emulator in
light and dark mode.
…ntrol

PairTooltips registers one entry per control (16 total) under the plugin
category; the longPressTooltip modifier intercepts long-press in the initial
pointer pass, shows the tooltip via IdeTooltipService with the 3-arg overload,
and consumes the rest of the gesture so the underlying control does not also
fire onClick. Verified on emulator: tooltips render with See more, taps and
text input unaffected.
Rounded teal tile matching the other plugins' card style: big < > centered
with a small WiFi fan at the top right. Day tile is deep teal with a white
glyph, night tile is bright teal with a dark glyph. Sidebar and tab keep the
existing people glyph.
plugin.name, app label, and the user guide now say Code Together; the tab and
sidebar keep the short Pair label and plugin.id is unchanged so existing
installs update in place. Docs prose also drops its em dashes.
check-toolchain.sh flagged four drifts against Code On The Go's on-device
toolchain: compileSdk/targetSdk 34 -> 36 and AGP 8.8.2 -> 8.11.0. AGP 8.11.0
needs Gradle >= 8.13, so drop pair's bundled 8.10.2 wrapper and use the
repo-root 8.14.3 wrapper (the convention in CLAUDE.md; update-libs.sh already
falls back to it when a plugin has no local gradlew). Verified assemblePlugin
still produces pair.cgp with the bumped toolchain.
@Daniel-ADFA
Daniel-ADFA merged commit 8e4df68 into main Aug 13, 2026
1 check passed
@Daniel-ADFA
Daniel-ADFA deleted the ADFA-4395 branch August 13, 2026 15:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants